package q69_mySqrt;

public class Solution_2 {

    int s;// 在开始先定义一个常数


    public static void main(String[] args) {
        Solution_2 s = new Solution_2();
        System.out.println(s.mySqrt(2147395599));
    }

    /**
     * 牛顿迭代法：
     * 首先随便猜一个近似值 x，
     * 然后不断令 x 等于 x 和 a/x 的平均数，迭代个六七次后 x 的值就已经相当精确了
     * 这种算法的原理很简单，我们仅仅是不断用 (x, f(x)) 的切线来逼近方程 x^2-a=0的根
     */
    public int mySqrt(int x) {
        s = x;// a可以是任意的常数
        if(x == 0) return 0;
        return ((int)(sqrts(x)));
    }

    public double sqrts(double x){
        double res = (x + s / x) / 2;
        if (res == x) {
            return x;
        } else {
            return sqrts(res);
        }
    }

}
